home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / doconv.s < prev    next >
Text File  |  2000-01-10  |  9KB  |  425 lines

  1.     .include    doscall.mac
  2.     .include    global.mac
  3.  
  4. ;----------------------------------------------------------------
  5. ;PCMデータを前処理して.fmpファイルに出力する
  6.     .text
  7.     .align    4,$2048
  8. do_conv::
  9.     movem.l    d1-d7/a0-a6,-(sp)
  10.  
  11.     bsr    silent_print_banner
  12.  
  13.     bsr    malloc_buffer
  14.     bmi    99f
  15.  
  16.     bsr    make_table
  17.  
  18.     bsr    init_data
  19.     bmi    99f
  20.  
  21.     tst.b    silent_flag
  22.     bne    @f
  23.     lea.l    (m_conv_fmp_file1,pc),a0
  24.     bsr    eprint
  25.     bsr    71f
  26.     lea.l    (m_conv_fmp_file2,pc),a0
  27.     bsr    eprintcrlf
  28. @@:
  29.  
  30.     moveq.l    #1,d0            ;標準出力
  31.     move.l    output_filename_ptr,d1    ;'-'のときは0,
  32.                     ;それ以外で'.'がないときは'.fmp'を追加済み
  33.     beq    1f
  34.     movea.l    d1,a0
  35.     bsr    wopen
  36.     bmi    80f            ;書き込みオープンエラー
  37. 1:    move.w    d0,output_fileno    ;ファイルハンドル
  38.  
  39.     lea.l    (m_conv_start_message,pc),a0
  40.     bsr    silent_eprintcrlf
  41.  
  42. ;第1ヘッダを作る
  43.     lea.l    fmp_header1,a2
  44.     move.l    a2,a0
  45.  
  46.     move.l    #'FMP ',(a0)+
  47.     lea.l    (m_banner,pc),a1
  48.     bsr    strcpy
  49.     move.b    #13,(a0)+
  50.     move.b    #10,(a0)+
  51.  
  52.     tst.b    param_env_work
  53.     beq    @f
  54.     lea.l    (str_set_space,pc),a1    ;'set '
  55.     bsr    strcpy
  56.     lea.l    (param_env_name,pc),a1
  57.     bsr    strcpy
  58.     move.b    #'=',(a0)+
  59.     lea.l    param_env_work,a1
  60.     bsr    strcpy
  61.     move.b    #13,(a0)+
  62.     move.b    #10,(a0)+
  63. @@:
  64.     tst.b    cdrom_env_work
  65.     beq    @f
  66.     lea.l    (str_set_space,pc),a1    ;'set '
  67.     bsr    strcpy
  68.     lea.l    (cdrom_env_name,pc),a1
  69.     bsr    strcpy
  70.     move.b    #'=',(a0)+
  71.     lea.l    cdrom_env_work,a1
  72.     bsr    strcpy
  73.     move.b    #13,(a0)+
  74.     move.b    #10,(a0)+
  75. @@:
  76.     lea.l    (program_head-256+$80,pc),a1    ;パス
  77.     bsr    strcpy
  78.     lea.l    (program_head-256+$C4,pc),a1    ;ファイル名
  79.     bsr    strcpy
  80.     move.b    #' ',(a0)+
  81.     movea.l    (program_head-256+$20,pc),a1    ;コマンドライン
  82.     addq.l    #1,a1
  83.     bsr    strcpy
  84.     move.b    #13,(a0)+
  85.     move.b    #10,(a0)+
  86.  
  87.     move.b    #$1A,(a0)+
  88.     clr.b    (a0)
  89.  
  90.     suba.l    a2,a0
  91.     move.l    a0,fmp_header1_size    ;第1ヘッダのサイズ
  92.     move.l    a0,-(sp)
  93.     move.l    a2,-(sp)
  94.     move.w    output_fileno,-(sp)
  95.     DOS    _WRITE
  96.     lea.l    (10,sp),sp
  97.     tst.l    d0
  98.     bmi    82f            ;書き込みエラー
  99.     cmp.l    a0,d0
  100.     bne    83f            ;ディスクフル?
  101.  
  102. ;第2ヘッダを作る
  103.     lea.l    fmp_header2,a2
  104.     movea.l    a2,a0
  105.  
  106.     move.l    #'S44P',(a0)+        ;'S44P'
  107.     move.l    #FMP_VERSION,(a0)+    ;FMP_VERSION
  108.  
  109.     move.l    #4+4,(a0)+        ;ヘッダのサイズ(4+4=8)
  110.     tst.b    mono_flag
  111.     beq    1f
  112.     move.l    #1,(a0)+        ;モノラル
  113.     bra    2f
  114. 1:    move.l    #2,(a0)+        ;ステレオ
  115. 2:
  116.  
  117.     move.b    output_timerd_count,d0
  118.     bpl    1f
  119.     move.l    a0,-(sp)
  120.     lea.l    (default_timerd_count_table_000,pc),a0
  121.     tst.b    current_machine_num
  122.     beq    @f
  123.     lea.l    (default_timerd_count_table_030,pc),a0
  124. @@:    moveq.l    #0,d0
  125.     move.b    current_mpu_num,d0
  126.     move.b    (a0,d0.l),d0
  127.     movea.l    (sp)+,a0
  128. 1:    move.b    d0,data_timerd_count
  129.     moveq.l    #1,d1
  130.     tst.b    mono_flag
  131.     bne    @f
  132.     moveq.l    #2,d1
  133. @@:    bsr    timerd_count_to_frequency
  134.     move.l    d0,(a0)+        ;サンプリング周波数
  135.  
  136.     clr.l    (a0)+            ;データ本体のサイズを記録する領域
  137.  
  138.     suba.l    a2,a0
  139.     move.l    a0,fmp_header2_size    ;第2ヘッダ+データ本体のサイズの領域のサイズ
  140.     move.l    a0,-(sp)
  141.     move.l    a2,-(sp)
  142.     move.w    output_fileno,-(sp)
  143.     DOS    _WRITE
  144.     lea.l    (10,sp),sp
  145.     tst.l    d0
  146.     bmi    82f            ;書き込みエラー
  147.     cmp.l    a0,d0
  148.     bne    83f            ;ディスクフル?
  149.  
  150.     lea.l    param_buf,a2
  151.     tst.l    (pb_ptr,a2)
  152.     bmi    do_conv_done
  153.  
  154. ;1番目のデータ
  155.     move.l    a2,current_param_ptr
  156.     bsr    open_data
  157.     bmi    60f            ;エラー
  158.     beq    11f            ;データなし正常終了
  159.  
  160. ;.fmpファイルにモノラルとステレオを混在できないので,
  161. ;-mono指定がないときモノラルデータは不可とする
  162. ;ただし、データが1個しかないときは強制的にモノラルモードに切り替える
  163.     tst.b    mono_flag
  164.     bne    @f
  165.     tst.b    mono_data_flag
  166.     beq    @f
  167.     movea.l    next_param_ptr,a0
  168.     tst.l    (pb_ptr,a0)
  169.     bpl    84f            ;次のデータがあるのでエラー
  170.     st.b    mono_flag        ;強制的に-mono指定にする
  171. @@:
  172.     bra    do_conv_loop_1
  173.  
  174. do_conv_loop:
  175.     move.l    a2,current_param_ptr
  176.     bsr    open_data
  177.     bmi    60f            ;エラー
  178.     beq    11f            ;データなし正常終了
  179.  
  180. ;.fmpファイルにモノラルとステレオを混在できないので,
  181. ;-mono指定がないときモノラルデータは不可とする
  182.     tst.b    mono_flag
  183.     bne    @f
  184.     tst.b    mono_data_flag
  185.     bne    84f
  186. @@:
  187.  
  188. do_conv_loop_1:
  189.  
  190. ;FMPフォーマットのデータはモノラル/ステレオを変換できない
  191.     tst.b    fmp_data_flag
  192.     beq    @f
  193.     tst.b    mono_data_flag
  194.     beq    1f
  195.     tst.b    mono_flag
  196.     beq    85f
  197.     bra    2f
  198. 1:    tst.b    mono_flag
  199.     bne    85f
  200. 2:
  201. @@:
  202.  
  203.     bsr    init_preconv
  204.  
  205.     tst.b    silent_flag
  206.     bne    @f
  207.     bsr    get_restsize_data    ;残りサイズ=データのサイズを得る
  208.     move.l    d0,d7
  209. @@:
  210.  
  211.     clr.l    fmp_data_size
  212.  
  213.     movea.l    buf0top,a3
  214.     movea.l    buf1top,a4
  215.     movea.l    buf2top,a5
  216.     movea.l    buf3top,a6
  217. 10:    DOS    _KEYSNS
  218.     cmp.b    #3,d0
  219.     beq    81f
  220.     movea.l    a3,a0            ;出力バッファの先頭
  221.     movea.l    a4,a1            ;入力バッファの先頭
  222.     bsr    read_data
  223.     bmi    60f
  224.     beq    11f
  225.     move.l    d0,d1            ;変換後のサイズ
  226.  
  227.     tst.b    silent_flag
  228.     bne    @f
  229.     moveq.l    #13,d0
  230.     bsr    eputchar
  231.     bsr    get_restsize_data    ;残りサイズ=データのサイズを得る
  232.     sub.l    d7,d0
  233.     neg.l    d0
  234.     bsr    utos_eprint
  235.     moveq.l    #' ',d0
  236.     bsr    eputchar
  237.     moveq.l    #'/',d0
  238.     bsr    eputchar
  239.     moveq.l    #' ',d0
  240.     bsr    eputchar
  241.     move.l    d7,d0
  242.     bsr    utos_eprint
  243. @@:
  244.  
  245.     tst.b    (1,a3,d1.l)        ;$00+$00/$01
  246.     bne    @f
  247.     andi.b    #$7F,(-1,a3,d1.l)    ;エンドコードを除去する
  248. @@:
  249.  
  250.     move.l    d1,-(sp)
  251.     move.l    a3,-(sp)        ;バッファの先頭
  252.     move.w    output_fileno,-(sp)
  253.     DOS    _WRITE
  254.     lea.l    (10,sp),sp
  255.     tst.l    d0
  256.     bmi    82f            ;書き込みエラー
  257.     cmp.l    d1,d0
  258.     bne    83f            ;ディスクフル
  259.     add.l    d1,fmp_data_size
  260.     exg.l    a3,a5
  261.     exg.l    a4,a6
  262.     bra    10b
  263. 11:
  264.     tst.b    silent_flag
  265.     bne    @f
  266.     moveq.l    #13,d0
  267.     bsr    eputchar
  268.     move.l    d7,d0
  269.     bsr    utos_eprint
  270.     moveq.l    #' ',d0
  271.     bsr    eputchar
  272.     moveq.l    #'/',d0
  273.     bsr    eputchar
  274.     moveq.l    #' ',d0
  275.     bsr    eputchar
  276.     move.l    d7,d0
  277.     bsr    utos_eprint
  278. @@:
  279.  
  280.     bsr    close_data
  281.  
  282.     movea.l    next_param_ptr,a2
  283.     tst.l    (pb_ptr,a2)
  284.     bpl    do_conv_loop
  285.  
  286. do_conv_done:
  287.  
  288.     move.l    fmp_header1_size,d1
  289.     add.l    fmp_header2_size,d1    ;ヘッダ+データ本体のサイズの領域のサイズ
  290.     subq.l    #4,d1            ;ヘッダのデータ本体のサイズの領域のオフセット
  291.     clr.w    -(sp)
  292.     move.l    d1,-(sp)
  293.     move.w    output_fileno,-(sp)
  294.     DOS    _SEEK
  295.     addq.l    #8,sp
  296.     move.l    fmp_data_size,-(sp)    ;ヘッダにデータ本体のサイズを書き込む
  297.     pea.l    4.w
  298.     pea.l    (4,sp)
  299.     move.w    output_fileno,-(sp)
  300.     DOS    _WRITE
  301.     lea.l    (10+4,sp),sp
  302.     addq.l    #4,d1            ;データ本体の先頭のオフセット
  303.     add.l    fmp_data_size,d1    ;データ本体の末尾のオフセット
  304.     clr.w    -(sp)            ;念のためポインタをファイルの末尾に進めておく
  305.     move.l    d1,-(sp)
  306.     move.w    output_fileno,-(sp)
  307.     DOS    _SEEK
  308.     addq.l    #8,sp
  309.  
  310.     tst.b    silent_flag
  311.     bne    @f
  312.     bsr    ecrlf
  313.     lea.l    (m_fmp_data_size1,pc),a0
  314.     bsr    eprint
  315.     move.l    fmp_data_size,d0
  316.     bsr    utos_eprint
  317.     lea.l    (m_fmp_data_size2,pc),a0
  318.     bsr    eprint
  319. @@:
  320.  
  321.     moveq.l    #0,d0
  322. 60:    bsr    silent_ecrlf
  323. 61:    move.l    d0,d7
  324.  
  325.     move.w    output_fileno,d0
  326.     cmp.w    #1,d0
  327.     ble    1f
  328.     move.w    d0,-(sp)
  329.     DOS    _CLOSE
  330.     addq.l    #2,sp
  331.     move.w    #-1,output_fileno
  332.     tst.l    d7
  333.     beq    1f
  334.     move.l    output_filename_ptr,d0
  335.     beq    1f
  336.     move.l    d0,-(sp)
  337.     DOS    _DELETE
  338.     addq.l    #4,sp
  339. 1:
  340.  
  341.                     ;バッファの開放はメインルーチンがやるので不要
  342.  
  343.     move.l    d7,d0
  344.  
  345. 99:    tst.l    d0
  346.     movem.l    (sp)+,d1-d7/a0-a6
  347.     rts
  348.  
  349. 80:    move.w    #EXIT_CANNOT_WRITE_OPEN,exit_code
  350.     bsr    70f
  351.     lea.l    (m_cannot_write_open,pc),a0
  352.     bra    89f
  353. 81:    bsr    ecrlf
  354.     lea.l    (m_conv_abort,pc),a0
  355.     bra    88f
  356. 82:    move.w    #EXIT_FILE_WRITE_ERROR,exit_code
  357.     bsr    70f
  358.     lea.l    (m_file_write_error,pc),a0
  359.     bra    89f
  360. 83:    move.w    #EXIT_DISK_FULL,exit_code
  361.     bsr    70f
  362.     lea.l    (m_disk_full,pc),a0
  363.     bra    89f
  364. 84:    move.w    #EXIT_FMP_MONO_CONFLICT,exit_code
  365.     lea.l    (m_mono_conflict,pc),a0
  366.     bra    88f
  367. 85:    move.w    #EXIT_FMP_CONFLICT,exit_code
  368.     lea.l    (m_fmp_conflict,pc),a0
  369. 88:    bsr    eaonly
  370. 89:    bsr    eprintcrlf
  371.     moveq.l    #-1,d0
  372.     bra    61b
  373.  
  374. 70:    bsr    eaonly
  375. 71:    lea.l    (m_stdout_message,pc),a0
  376.     move.l    output_filename_ptr,d0
  377.     beq    eprint
  378.     lea.l    (m_file_message1,pc),a0
  379.     bsr    eprint
  380.     movea.l    d0,a0
  381.     bsr    eprint
  382.     lea.l    (m_file_message2,pc),a0
  383.     bra    eprint
  384.  
  385. str_set_space:        .dc.b    'set ',0
  386.  
  387. m_conv_fmp_file1:    .dc.b    'PCM → OPM 変換を行い、',0
  388. m_conv_fmp_file2:    .dc.b    'に出力します',0
  389. m_stdout_message:    .dc.b    '標準出力'
  390. ;m_file_message1:    .dc.b    "ファイル `",0
  391. ;m_file_message2:    .dc.b    "' ",0
  392. m_fmp_data_size1:    .dc.b    '出力データサイズ: ',0
  393. m_fmp_data_size2:    .dc.b    ' バイト',0
  394. m_cannot_write_open:    .dc.b    'を作れません',0
  395. m_conv_start_message:    .dc.b    '変換を開始します',0
  396. m_conv_abort:        .dc.b    '変換を中止します',0
  397. m_file_write_error:    .dc.b    'に書き込めません',0
  398. m_disk_full:        .dc.b    'に書き込めません(ディスクフル)',0
  399. m_mono_conflict:    .dc.b    'モノラルのデータはステレオに変換できません',0
  400. m_fmp_conflict:        .dc.b    'FMP フォーマットのデータはモノラル/ステレオを変換できません',0
  401.     .even
  402.  
  403.     .data
  404.     .even
  405. output_fileno::        .dc.w    -1
  406.  
  407.     .bss
  408. ;第1ヘッダ
  409.     .even
  410. fmp_header1:        .ds.b    FMP_CHECK_LENGTH
  411. ;第2ヘッダ
  412.     .align    4
  413. fmp_header2:        .ds.l    1    ;'S44P'
  414.             .ds.l    1    ;FMP_VERSION
  415.             .ds.l    1    ;ヘッダのサイズ(4+4=8)
  416.                     ;ヘッダ
  417.             .ds.l    1    ;チャンネル数(1=モノラル,2=ステレオ)
  418.             .ds.l    1    ;サンプリング周波数(44100)
  419.             .ds.l    1    ;データ本体のサイズを記録する領域
  420.     .align    4
  421. fmp_header1_size:    .ds.l    1    ;第1ヘッダのサイズ
  422. fmp_header2_size:    .ds.l    1    ;第2ヘッダ+データ本体のサイズの領域のサイズ
  423. fmp_data_size:        .ds.l    1    ;データ本体のサイズ
  424.  
  425.